﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.Web.Helpers;

using JPSOFTWARE.BON.Modelos;
using JPSOFTWARE.BON.Regra;
using System.Web.Helpers;
using System.Net.Mail;
using JPSoftwareMVC.Filtro;

namespace JPSoftwareMVC.Areas.GestaoUsuario.Controllers
{
    public class UsuarioController : Controller
    {
        [Authorize]
        public ActionResult Index()
        {
            return View();
        }

        public void CarregarTiposUsuario()
        {
            RnProdutos rnProdutos = new RnProdutos();
            List<Categoria> categoria = rnProdutos.ListarCategoria();
            List<UsuarioModel> tipoUsuario = new List<UsuarioModel>()
            {
                new UsuarioModel{TipoUsuario = 1, Nome ="Administrador"},
                new UsuarioModel{TipoUsuario = 2, Nome="Usuário"}                
            };
            ViewData["TipoUsuarioCombo"] = new SelectList(tipoUsuario, "TipoUsuario", "Nome");
        }

        public JsonResult CarregarUsuarios()
        {            
            RnUsuario rnUsuario = new RnUsuario();
            List<UsuarioView> lista = new List<UsuarioView>();
            lista = rnUsuario.ListarUsuariosView();
            return Json(lista, JsonRequestBehavior.AllowGet);
        }

        [Authorize]
        [HttpGet]  
        [RegraAcesso(Roles="Administrador")]
        public ActionResult GerenciarUsuario()
        {            
            return View();
        }

        [Authorize]
        [HttpGet]
        [RegraAcesso(Roles = "Administrador")]
        public ActionResult AlterarSituacaoUsuario(int id)
        {
            RnUsuario rnUsuario = new RnUsuario();
            UsuarioEditarModel usuarioModel = new UsuarioEditarModel();

            ViewData["AlterarSituacaoUsuarioAlterado"] = false;

            CarregarTiposUsuario();

            usuarioModel = rnUsuario.EditarUsuario(id);

            return View(usuarioModel);
        }

        [Authorize]
        [HttpPost]
        [RegraAcesso(Roles = "Administrador")]
        public ActionResult AlterarSituacaoUsuario(UsuarioEditarModel usuarioEditarModel)
        {
            RnUsuario rnUsuario = new RnUsuario();
            Retorno retorno = new Retorno();

            try
            {
                if (Session["DadosUsuario"] != null)
                {
                    retorno = rnUsuario.EditarUsuario(usuarioEditarModel);

                    if (retorno.Sucesso)
                    {
                        ViewData["AlterarSituacaoUsuarioAlterado"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                    else
                    {
                        ViewData["AlterarSituacaoUsuarioErro"] = true;
                        ViewData["Mensagem"] = retorno.Mensagem;
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            CarregarTiposUsuario();

            return View();
        }

        [Authorize]
        public ActionResult VerificaSenhaUsuario(string SenhaAtual)
        {
            UsuarioModel usuarioModel = new UsuarioModel();
            Retorno retorno = new Retorno();
            RnUsuario rnUsuario = new RnUsuario();

            if (Session["DadosUsuario"] != null)
            {                
                usuarioModel = Session["DadosUsuario"] as UsuarioModel;

                retorno = rnUsuario.VerificarSenhaUsuario(usuarioModel.IdUsuario, SenhaAtual);
            }

            if (retorno.Sucesso)
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(false, JsonRequestBehavior.AllowGet);
            }
        }
        
        public ActionResult VerificaSeExisteEmail(string email)
        {
            Retorno retorno = new Retorno();
            RnUsuario rnUsuario = new RnUsuario();

            retorno = rnUsuario.VerificaSeExisteEmail(email);

            if (retorno.Sucesso)
            {
                return Json(false, JsonRequestBehavior.AllowGet);
            }
            else
            {
                return Json(true, JsonRequestBehavior.AllowGet);
            }
        }

        //public Retorno VerificaSeExisteEmail(string email)
        //{
        //    Retorno retorno = new Retorno();
        //    RnUsuario rnUsuario = new RnUsuario();

        //    retorno = rnUsuario.VerificaSeExisteEmail(email);

        //    return retorno;
        //}

        [Authorize]
        public ActionResult VisualizarUsuario(string email)
        {
            return View();
        }

        [Authorize]
        public ActionResult ListarUsuario()
        {
            UsuarioModel usuarioModel = new UsuarioModel();
            UsuarioView usuarioView = new UsuarioView();

            if (Session["DadosUsuario"] != null)
            {
                usuarioModel = Session["DadosUsuario"] as UsuarioModel;

                RnUsuario rnUsuario = new RnUsuario();
                List<UsuarioView> lista = new List<UsuarioView>();
                lista = rnUsuario.ListarUsuarioView(usuarioModel.IdUsuario);

                foreach (var item in lista)
                {
                    usuarioView.IdUsuario = item.IdUsuario;
                    usuarioView.Nome = item.Nome;
                    usuarioView.Email = item.Email;
                    usuarioView.TipoUsuario = item.TipoUsuario;
                    usuarioView.Status = item.Status;
                    usuarioView.DataAlteracao = item.DataAlteracao;
                }
            }
            return View(usuarioView);
        }
        
        [HttpGet]
        public ActionResult RegistrarUsuario()
        {
            ViewData["RegistrarUsuario"] = false;
            ViewData["EnviarEmail"] = true;
            return View();
        }

        public bool EnviarEmail(UsuarioRegistrarModel registrarUsuario)
        {
            bool retorno = false;

            string _email = registrarUsuario.Email;
            string _senha = registrarUsuario.Senha;

            string assunto = String.Empty;
            string mensagem = String.Empty;

            //CONFIRMAÇÃO
            try
            {
                //Eu gero um hash de 8 caracteres
                //string _hash = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Substring(1, 8);

                string sha256 = Hash.GetHash(_email, Hash.HashType.SHA256);
                bool sha256Checado = Hash.CheckHash(_email, sha256, Hash.HashType.SHA256);

                assunto = "Bebida Social - Confirmação de Cadastro de Usuário";


                mensagem = "<div>Olá usuário," +
                    "<br>" +
                    "<br>" +
                    "Você solicitou a criação do usuário <a>" + _email + "</a> no site <a href='http://www.bebidasocial.com.br' target='_blank'>http://www.bebidasocial.com.br</a><br>" +
"Para confirmar acesse o link abaixo:<br>" +
"<a href='" + "http://www.bebidasocial.com.br/Inicio/Confirmacao?Confirme=" + sha256 + "&Email=" + _email + "'>Confirmar cadastro no Bebida Social</a><br>" +
                "<br>" +
                "<br>" +
                "Se não foi você que fez esta solicitação, por favor, ignore esta mensagem<br>" +
                "<br>" +
                "<br>" +
                "<br>" +
                "Obrigado por usar o Bebida Social<br>" +
                "------------------------------<wbr>-------------------------<br>" +
                "<br>" +
                "Não responda este email porque ele não pode ser lido<br>" +
                "Se deseja entrar em contato utilize um dos canais abaixo<br>" +
                "Website: <a href='http://www.bebidasocial.com.br' target='_blank'>http://www.bebidasocial.com.br</a><br>" +
                "Twitter: <a href='http://twitter.com/bebbidasocial' target='_blank'>http://twitter.com/bebidasocial</a></div>";

                //mensagem = "http://localhost:32086/Inicio/Confirmacao?Confirme=" + sha256 + "&Email=" + _email;

				//WebMail.SmtpServer = "mail.netitc.com.br";
				//WebMail.SmtpPort = 2525;                
				//WebMail.From = "naoresponda@bebidasocial.com.br";
				//WebMail.UserName = " naoresponda@bebidasocial.com.br";
				//WebMail.Password = "XperiaX8*";

				MailMessage mailMessage = new MailMessage("contato@juniorpacheco.net.br", _email, assunto, mensagem);
				mailMessage.IsBodyHtml = true;
                SmtpClient emailClient = new SmtpClient("mail.juniorpacheco.net.br", 25);
                System.Net.NetworkCredential SMTPUserInfo = new System.Net.NetworkCredential("contato@juniorpacheco.net.br", "xperiax8");						
				emailClient.UseDefaultCredentials = false;
				emailClient.Credentials = SMTPUserInfo;				
				emailClient.Send(mailMessage);

                //WebMail.SmtpServer = "smtp.gmail.com";
                //WebMail.SmtpPort = 587;
                //WebMail.EnableSsl = true;
                //WebMail.From = "boloboca@gmail.com";
                //WebMail.UserName = "boloboca@gmail.com";
                //WebMail.Password = "xperiax10";

                //WebMail.Send(HttpUtility.HtmlEncode(_email), assunto, mensagem);

                retorno = true;                
            }
            catch (SmtpFailedRecipientsException ex)
            {
                for (int i = 0; i < ex.InnerExceptions.Length; i++)
                {
                    SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
                    if (status == SmtpStatusCode.MailboxBusy ||
                        status == SmtpStatusCode.MailboxUnavailable)
                    {
                        Console.WriteLine("Ops! Uma falha ocorreu ao enviar um e-mail para você! - Tentando reenviar em 5 segundos.");
                        System.Threading.Thread.Sleep(5000);
                        WebMail.Send(_email, assunto, mensagem);
                    }
                    else
                    {
                        Console.WriteLine("Falha ao enviar mensagem para {0}",
                            ex.InnerExceptions[i].FailedRecipient);
                    }
                }
            }
            catch (SmtpException smtpEx)
            {
                //throw smtpEx;                
            }

            return retorno;
        }

        [HttpPost]
        public ActionResult RegistrarUsuario(UsuarioRegistrarModel registrarUsuario)
        {
            Retorno retorno = new Retorno();
            RnUsuario rnUsuario = new RnUsuario();

            retorno = rnUsuario.RegistrarLogin(registrarUsuario);

            if (retorno.Sucesso)
            {

                if (EnviarEmail(registrarUsuario))
                    ViewData["RegistrarUsuario"] = true;
                else
                    ViewData["EnviarEmail"] = false;
                                
            }
            return View();
        }

        [Authorize]
        [HttpGet]
        public ActionResult EditarUsuario(int id)
        {
            RnUsuario rnUsuario = new RnUsuario();
            UsuarioEditarModel editarModel = new UsuarioEditarModel();

            editarModel = rnUsuario.EditarUsuario(id);

            if (editarModel != null)
            {
                ViewBag.IdUsuario = editarModel.IdUsuario;

                return View(editarModel);
            }
            if (editarModel == null)
            {
                return View("NotFound");
            }
            else
            {
                ViewData["UsuarioErro"] = Mensagens.MSG_006;
                return View();
            }
        }

        [Authorize]
        [HttpPost]
        public ActionResult EditarUsuario(UsuarioEditarModel editarModel)
        {
            RnUsuario rnUsuario = new RnUsuario();
            Retorno retorno = new Retorno();

            retorno = rnUsuario.EditarUsuario(editarModel);

            if (retorno.Sucesso)
            {
                ViewData["EditarUsuario"] = true;
                ViewData["Mensagem"] = retorno.Mensagem;

            }
            else
            {
                ViewData["EditarUsuario"] = false;
                ViewData["UsuarioErro"] = retorno.Mensagem;
            }
            return View();
        }

        [Authorize]
        public ActionResult ExcluirUsuario(int id)
        {
            RnUsuario rnUsuario = new RnUsuario();
            UsuarioModel usuarioModel = new UsuarioModel();


            return View();
        }

        [Authorize]
        [HttpPost]
        public ActionResult Delete(int id, FormCollection collection)
        {
            try
            {
                // TODO: Add delete logic here

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}